/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.vfs; import org.apache.commons.logging.Log; import java.io.File; import java.net.URLStreamHandlerFactory; import java.util.Collection; import java.lang.reflect.Constructor; import org.apache.commons.vfs.operations.FileOperationProvider; /** * A FileSystemManager manages a set of file systems. This interface is * used to locate a {@link FileObject} by name from one of those file systems. * <p/> * <p>To locate a {@link FileObject}, use one of the <code>resolveFile()</code> * methods.</p> * <p/> * <h4><a name="naming">File Naming</a></h4> * <p/> * <p>A file system manager can recognise several types of file names: * <p/> * <ul> * <p/> * <li><p>Absolute URI. These must start with a scheme, such as * <code>file:</code> or <code>ftp:</code>, followed by a scheme dependent * file name. Some examples:</p> * <pre> * file:/c:/somefile * ftp://somewhere.org/somefile * </pre> * <p/> * <li><p>Absolute local file name. For example, * <code>/home/someuser/a-file</code> or <code>c:\dir\somefile.html</code>. * Elements in the name can be separated using any of the following * characters: <code>/</code>, <code>\</code>, or the native file separator * character. For example, the following file names are the same:</p> * <pre> * c:\somedir\somefile.xml * c:/somedir/somefile.xml * </pre> * <p/> * <li><p>Relative path. For example: <code>../somefile</code> or * <code>somedir/file.txt</code>. The file system manager resolves relative * paths against its <i>base file</i>. Elements in the relative path can be * separated using <code>/</code>, <code>\</code>, or file system specific * separator characters. Relative paths may also contain <code>..</code> and * <code>.</code> elements. See {@link FileObject#resolveFile} for more * details.</p> * <p/> * </ul> * * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> * @version $Revision: 484648 $ $Date: 2006-12-08 17:18:36 +0100 (Fr, 08 Dez 2006) $ */ public interface FileSystemManager { /** * Returns the base file used to resolve relative paths. */ public FileObject getBaseFile() throws FileSystemException; /** * Locates a file by name. Equivalent to calling * <code>resolveFile(uri, getBaseName())</code>. * * @param name The name of the file. * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ public FileObject resolveFile(String name) throws FileSystemException; /** * Locates a file by name. Equivalent to calling * <code>resolveFile(uri, getBaseName())</code>. * * @param name The name of the file. * @param fileSystemOptions The FileSystemOptions used for FileSystem creation * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ public FileObject resolveFile(String name, FileSystemOptions fileSystemOptions) throws FileSystemException; /** * Locates a file by name. The name is resolved as described * <a href="#naming">above</a>. That is, the name can be either * an absolute URI, an absolute file name, or a relative path to * be resolved against <code>baseFile</code>. * <p/> * <p>Note that the file does not have to exist when this method is called. * * @param name The name of the file. * @param baseFile The base file to use to resolve relative paths. * May be null. * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ public FileObject resolveFile(FileObject baseFile, String name) throws FileSystemException; /** * Locates a file by name. See {@link #resolveFile(FileObject, String)} * for details. * * @param baseFile The base file to use to resolve relative paths. * May be null. * @param name The name of the file. * @return The file. Never returns null. * @throws FileSystemException On error parsing the file name. */ public FileObject resolveFile(File baseFile, String name) throws FileSystemException; /** * Resolves a name, relative to this file name. Equivalent to calling * <code>resolveName( path, NameScope.FILE_SYSTEM )</code>. * * @param root the base filename * @param name The name to resolve. * @return A {@link FileName} object representing the resolved file name. * @throws FileSystemException If the name is invalid. */ public FileName resolveName(final FileName root, final String name) throws FileSystemException; /** * Resolves a name, relative to the "root" file name. Refer to {@link NameScope} * for a description of how names are resolved. * * @param root the base filename * @param name The name to resolve. * @param scope The {@link NameScope} to use when resolving the name. * @return A {@link FileName} object representing the resolved file name. * @throws FileSystemException If the name is invalid. */ public FileName resolveName(final FileName root, String name, NameScope scope) throws FileSystemException; /** * Converts a local file into a {@link FileObject}. * * @param file The file to convert. * @return The {@link FileObject} that represents the local file. Never * returns null. * @throws FileSystemException On error converting the file. */ public FileObject toFileObject(File file) throws FileSystemException; /** * Creates a layered file system. A layered file system is a file system * that is created from the contents of a file, such as a zip or tar file. * * @param provider The name of the file system provider to use. This name * is the same as the scheme used in URI to identify the provider. * @param file The file to use to create the file system. * @return The root file of the new file system. * @throws FileSystemException On error creating the file system. */ public FileObject createFileSystem(String provider, FileObject file) throws FileSystemException; /** * Closes the given filesystem.<br /> * If you use VFS as singleton it is VERY dangerous to call this method. */ public void closeFileSystem(FileSystem filesystem); /** * Creates a layered file system. A layered file system is a file system * that is created from the contents of a file, such as a zip or tar file. * * @param file The file to use to create the file system. * @return The root file of the new file system. * @throws FileSystemException On error creating the file system. */ public FileObject createFileSystem(FileObject file) throws FileSystemException; /** * Creates an empty virtual file system. Can be populated by adding * junctions to it. * * @param rootUri The root URI to use for the new file system. Can be null. * @return The root file of the new file system. */ public FileObject createVirtualFileSystem(String rootUri) throws FileSystemException; /** * Creates a virtual file system. The file system will contain a junction * at the fs root to the supplied root file. * * @param rootFile The root file to backs the file system. * @return The root of the new file system. */ public FileObject createVirtualFileSystem(FileObject rootFile) throws FileSystemException; /** * Returns a streamhandler factory to enable URL lookup using this * FileSystemManager. */ public URLStreamHandlerFactory getURLStreamHandlerFactory(); /** * Determines if a layered file system can be created for a given file. * * @param file The file to check for. */ public boolean canCreateFileSystem(FileObject file) throws FileSystemException; /** * Get the cache used to cache fileobjects. */ public FilesCache getFilesCache(); /** * Get the cache strategy used */ public CacheStrategy getCacheStrategy(); /** * Get the file object decorator used */ public Class getFileObjectDecorator(); /** * The constructor associated to the fileObjectDecorator. * We cache it here for performance reasons. */ public Constructor getFileObjectDecoratorConst(); /** * The class to use to determine the content-type (mime-type) */ public FileContentInfoFactory getFileContentInfoFactory(); /** * Get the schemes currently available. */ public String[] getSchemes(); /** * Get the capabilities for a given scheme. * * @throws FileSystemException if the given scheme is not konwn */ public Collection getProviderCapabilities(final String scheme) throws FileSystemException; /** * Sets the logger to use. */ public void setLogger(final Log log); /** * Get the configuration builder for the given scheme * * @throws FileSystemException if the given scheme is not konwn */ public FileSystemConfigBuilder getFileSystemConfigBuilder(final String scheme) throws FileSystemException; /** * Resolve the uri to a filename * * @throws FileSystemException if this is not possible */ public FileName resolveURI(String uri) throws FileSystemException; // -- OPERATIONS -- /** * Adds the specified FileOperationProvider for the specified scheme. * Several FileOperationProvider's might be registered for the same scheme. * For example, for "file" scheme we can register SvnWsOperationProvider and * CvsOperationProvider. * * @param scheme * @param operationProvider * @throws FileSystemException */ public void addOperationProvider(final String scheme, final FileOperationProvider operationProvider) throws FileSystemException; /** * @see FileSystemManager#addOperationProvider(String, org.apache.commons.vfs.operations.FileOperationProvider) * * @param schemes * @param operationProvider * @throws FileSystemException */ public void addOperationProvider(final String[] schemes, final FileOperationProvider operationProvider) throws FileSystemException; /** * @param scheme the scheme for wich we want to get the list af registered providers. * * @return the registered FileOperationProviders for the specified scheme. * If there were no providers registered for the scheme, it returns null. * * @throws FileSystemException */ public FileOperationProvider[] getOperationProviders(final String scheme) throws FileSystemException; }